package mqpaydemo.paydemo.config;



import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

/**
 * @Description:3、三种发布模式
 * 根据交换机类型不同，分为3种：
 * Direct<直接>：1对1-----一个消息只能被一个消费者消费
 * Topic<主题>：1对多-----一个消息可以被多个消费者消费（纠正：一个消息可被多个队列接收，若多个消费者监听同一个队列，会以轮询方式被多个消费者接收，本质依然是1对1，类Direct。详述见下方评论！）
 * Fanout<分列>：广播
 * ————————————————
 * 版权声明：本文为CSDN博主「跟我一起舔瓶盖儿」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/weixin_44004647/article/details/88420281
 * @Author: liujinsheng
 * @Date: 2021/9/10.
 */
@Configuration
@Slf4j
public class DirectRabbitConfig {
    @Autowired
    private Environment env;
    /**
     * 以下配置是直接模式，一对一的,就是建单个队列,其他的不要配置
     * @author lst
     * @date 2020-5-22 14:16
     **
     * 队列1
     * @return
     */
    @Bean
    public Queue payQueue(){
        return new Queue("payQuequ");
    }

    /**
     * 队列2
     * @return
     */
    @Bean
    public Queue testQuequ(){
        return  new Queue("testQuequ");
    }
   /**
   Topic发布模式交换机
    */

    @Bean
    public  TopicExchange exchange(){
        return  new TopicExchange("exchange");
    }

//主题交换机，根据消息携带的路由键和交换机与队列绑定键的规则，将消息转发给对应的队列
//
//规则：
//
//*（星号）：表示一个字符必须出现
//
//#（井号）：表示任意数量的字符
    /**
     * 绑定队列1到交换机
     * @return
     */
    @Bean
    public Binding binding(){
        //绑定队列1 到交换机带着路由键
        return BindingBuilder.bind(payQueue()).to(exchange()).with("topic.01");

    }
    @Bean
    public Binding binding2(){
        //绑定队列2 到交换机带着路由键
        return BindingBuilder.bind(testQuequ()).to(exchange()).with("topic.#");

    }

    // 测试confirm 机制，专门创建了一个队列
    @Bean
    public Queue queueConfirm() {
        return new Queue("queue_confirm");
    }

}
